package org.lora.core.bean;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import org.lora.core.jdbctx.TransactionSynchronizationManager;

/**
 * <p>
 * Title:ProxyMethodInterceptor
 * </p>
 * <p>
 * Desription:动态代理Interceptor<br>
 * 代理所有的Action Service 但是不代理DAO DAO用的是Mybatis的动态代理</br>
 * 当然，mongodb的操作DAO类这种的也不会代理</br>
 * </p>
 * Create Time:2016年7月6日 下午4:29:55
 * 
 * @author Bladnir@outlook.com
 *         <p>
 *         History:
 *         </p>
 *         2016年07月06日 Bladnir Create<br>
 *         2016年11月23日 Bladnir 修改事务工厂<br>
 *         2016年12月02日 Bladnir 去除事务工厂，直接使用TransactionSynchronizationManager<br>
 */
public class ProxyMethodInterceptor implements MethodInterceptor {


	/*
	 * Object obj 代理类的实例 也就是 真实的类的子类的实例 <br> MethodProxy methodProxy
	 * 代理类的方法对象<br> Method method 真实的类的方法对象<br>
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] argArray, MethodProxy methodProxy) throws Throwable {

		if (Object.class.equals(method.getDeclaringClass())) {
			// Object自带方法 直接执行 不做任何处理
			return methodProxy.invokeSuper(obj, argArray);
		} else {
			Object result = null;
			try {
				TransactionSynchronizationManager.beginTransaction(method);
				result = methodProxy.invokeSuper(obj, argArray);
				TransactionSynchronizationManager.commitTransaction(method);
			} catch (Throwable t) {
				TransactionSynchronizationManager.rollbackTransaction();
				throw t;
			} finally {
				TransactionSynchronizationManager.endTransaction(method);
			}

			return result;
		}

	}
}
